#include <iostream>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

using namespace std;

static void Usage(const std::string &proc)
{
    cout << "\nUsage:" << proc << " pid signo\n"
         << endl;
}

// void handler(int signal)
// {
//     cout << "我被捕捉到了，signal:" << signal << endl;
//     sleep(1);
// }

int cnt = 0;

void catchSig(int signo)
{
    cout << "cnt: " << cnt << endl;
    std::cout << "获取到一个信号，信号编号是: " << signo << std::endl;
    exit(1);
}

// ./mysignal pid signo
// argc表示的是传递给程序的命令行参数的数量（包括程序名）
int main(int argc, char *argv[])
{
    signal(SIGALRM, catchSig);
    alarm(1);
    while (true)
    {
        cnt++;
        // printf("%d\n", cnt);
    }

    // int cnt = 0;
    // while(cnt <= 10)
    // {
    //     printf("cnt: %d,pid: %d\n",cnt++,getpid());
    //     sleep(1);
    //     // if(cnt >= 5) abort();
    //     if(cnt >= 5) raise(9);

    // }

    // // 数量不等于3个就给出提示
    // if (argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }
    // // 通过自定义的方式给对应进程发送信号
    // pid_t pid = atoi(argv[1]);
    // int signo = atoi(argv[2]);
    // int n = kill(pid, signo);
    // if (n != 0)
    // {
    //     perror("kill");
    // }

    // // 既然说Ctrl+c 是2号信号 -- 怎么证明？
    // // 对2号信号进行捕捉

    // // 这里是signal函数的调用，并不是handler的调用
    // // 仅仅是设置了对2号信号的捕捉方法，并不代表该方法被调用了
    // // 一般这个方法不会执行，除非收到对应的信号！
    // signal(2, handler);

    // int count = 1;
    // while (true)
    // {
    //     printf("我正在运行，进程pid:%d,count:%d\n", getpid(), count++);
    //     sleep(1);
    // }

    // signal(8,handler);

    // int a = 10;
    // a = a / 0;
    // printf("%d",a);

    // signal(11, catchSig);

    // cout << "我正在运行中..." << endl;
    // sleep(1);
    // int *ptr = nullptr;
    // // 野指针 对0地址进行解引用(nullptr == 0 属于OS 无法访问)
    // *ptr = 1;
    // printf("hh");

    // while (true)
    // {
    //     sleep(1);
    // }

    return 0;
}
